import re

def count_chars(text):
    """统计字符数（包括所有字符：字母、空格、标点、换行符等）"""
    return len(text)


def count_words(text):
    """统计单词数（以空白字符分隔的连续字符序列，忽略空字符串）"""
    # 去除首尾空白后若为空，直接返回0
    if not text.strip():
        return 0
    # 按任意空白字符（空格、制表符、换行等）分割，过滤空字符串
    words = [word for word in re.split(r'\s+', text.strip()) if word]
    return len(words)


def count_sentences(text):
    """统计句子数（以 . ! ? 结尾的视为句子，支持符号后无空格的情况）"""
    stripped_text = text.strip()
    if not stripped_text:  # 空文本或全空白，返回0
        return 0
    
    # 正则表达式：匹配以 .!? 结尾的句子（符号后是空格或文本结束）
    # [^.!?]* ：匹配句尾符号前的任意字符（非 .!? 的字符）
    # [.!?] ：匹配句尾符号（. 或 ! 或 ?）
    # (?=\s|$) ：断言符号后是空白字符或文本结束（确保是真正的句尾）
    sentence_pattern = r'[^.!?]*[.!?](?=\s|$)'
    sentences = re.findall(sentence_pattern, stripped_text)
    
    # 特殊情况：如果没有匹配到句尾符号，但文本非空（如"Hello world"），也算1个句子
    if not sentences:
        return 1
    
    return len(sentences)


def count_lines(text):
    """统计总行数（空文本视为1行）"""
    # 按换行符分割，空文本会返回 ['']，长度为1，符合预期
    return len(text.split('\n'))


def count_blank_lines(text):
    """统计空行（全为空白字符或空内容的行）"""
    lines = text.split('\n')
    blank_count = 0
    for line in lines:
        # 去除行内所有空白字符后若为空，视为空行
        if not line.strip():
            blank_count += 1
    return blank_count


def count_comment_lines(text):
    """统计注释行（以 # 开头的行，忽略纯空白后再判断）"""
    lines = text.split('\n')
    comment_count = 0
    for line in lines:
        stripped_line = line.strip()  # 去除行首行尾空白
        # 若行非空且以 # 开头，视为注释行
        if stripped_line.startswith('#') and len(stripped_line) > 1:
            comment_count += 1
    return comment_count


def count_code_lines(text):
    """统计代码行（非空行且非注释行）"""
    total = count_lines(text)
    blank = count_blank_lines(text)
    comment = count_comment_lines(text)
    # 代码行 = 总行数 - 空行数 - 注释行数
    return total - blank - comment